class: inverse,left, middle background-image: url(data:image/png;base64,#background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 1: Manipulación y Análisis de Datos Geoespaciales ### Introducción a R MatÃas Olea <br> <a href="https://orcid.org/0000-0003-0194-7784"> ORCID </a><br> matias.olea@pucv.cl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Agosto 2022</b>] <br> --- class: center,middle background-image: url(data:image/png;base64,#labgrs_logo.png) background-size: 35% --- ## ¿Qué aprenderemos en esta unidad? Aprenderemos ... -- 1) Que es R. -- 2) Los elementos esenciales de R: Script, objetos, funciones y paquetes. -- 3) La apertura y manipulación de datos alfanuméricos y numéricos. -- 4) La creación de funciones y ciclos. --- ## Introducción a R ### ¿Qué es R? -- - R es un lenguaje y entorno para la computación estadÃstica y gráficos. Es un proyecto GNU*. R proporciona una amplia variedad de estadÃsticos (como modelos lineales y no lineales, test, analisis de series de tiempo, clasificaciones, clustering, etc.) y técnicas gráficas. -- - Una de las grandes ventajas de R es la facilidad con la que se pueden producir diagramas bien diseñados con la calidad de publicación, que incluyen sÃmbolos matemáticos y fórmulas dónde sea necesario. .footnote[ <span style="font-size:9pt"> * GNU es un sistema operativo gratuito <br> Fuente: r-project.org </span> ] --- class:center,middle background-image:url(R-project.png) --- ### El entorno de R R es una interfaz integrada para manipulación de datos que incluye: -- - Un efectivo manejo de datos y facilidades de almacenamiento. -- - Una interfaz de operación para cálculos en colecciones de datos, especialmente matrices. -- - Una gran, coherente e integrada colección de herramientas para el análisis. -- - Facilidades gráficas para análisis de datos y visualización de ellos, y -- - Un desarrollado, simple y efectivo lenguaje de programación que incluyen condicionales, ciclos, funciones recursivas diseñadas o definidas por los usuarios, y más. .footnote[ <span style="font-size:9pt"> Fuente: r-project.org </span> ] --- ### ¿Qué es R? -- - R es un software de **libre acceso** (gratuito y abierto) para el análisis estadÃstico. -- - Es un pseudo-lenguaje de programación orientado a **''objetos''** -- - Hoy en dÃa, R no es solo una herramienta de análisis estadÃstico. Gracias a su potencialidad se ha transformado en una herramienta para analizar imágenes satelitales, datos del océano, variables biogeográficas, muestras dendro-cronológicas, cambio climático, etc… incluso se pueden hacer mapas. --- ### ¿Qué significa orientado a **objetos**? -- .pull-left[ Significa que si nosotros queremos aplicar una operación (función) podemos aplicárselo a un **"algo"** dentro del entorno de R, y ese "algo" va a ser un **"contenedor"** dónde almacenaremos variables o bases de datos, como por ejemplo números, palabras, vectores, tablas, etc. De esta forma, dependiendo que elemento contegamos es nuestro objeto, se definirá la **clase** del objeto. ] -- .pull-right[ <img src="data:image/png;base64,#Objeto_de_R.png" width="400px" align = "center"/> ] --- ### Creación de un objeto de R -- Para crear un objeto debemos definir un nombre para asignarle al objeto que debe ser alfabético o alfanumérico. -- Definido el nombre debemos indicarle una dirección a través del sÃmbolo **<-** seguido de lo que almacenaremos en el objeto como se ve aquÃ: -- ```r objeto1 <- 25 objeto2 <- "delfin" ``` -- Debemos considerar que los caracteres deben ir entre comillas, sino R los reconoce como objetos de R. -- ```r objeto2 <- delfin ```  --- ### Tipos de obetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que almacenemos dentro: -- .left-column[ <center><img src="data:image/png;base64,#DF_MX2.png" height="400px" /></center> ] -- .right-column[ - **Vector**: secuencia de valores, o valores únicos de tipo numéricos o de caracteres. - **Lista**: compilación de datos enlistados, pueden ser de varias clases. - **Data Frame**: tabla bidemensional formada por lineas/filas (observaciones) y columnas (variables). Dentro de su estructura, las columnas pueden ser vectores numéricos o de caracteres. Una caracteristica de este es que almacena "headers" que nombran la variable, pero este no forma parte de la base de datos en si misma. - **Matriz**: es un arreglo bidimensional al igual que el Data Frame, formado por la intersección filas y columnas que almacenan valores en celdas. No son capaces de almacenar "headers" pero se pueden indicar "nombres". ] --- ### Elementos de R De manera simplista, podemos definir ... -- **Paquetes** Conjunto de funciones almacenadas en un mismo repositorio. -- **Funciones** Operaciones o aplicaciones que se ejecutan a un conjunto de elementos o a objetos de R. -- **Argumentos** Cada función contiene un cierto número de argumentos o parámetros que permiten que la función sea aplicada. --- class:center,middle background-image:url(RStudio.png) background-size: 80% --- ### Aplicando conceptos -- Creando objetos con la función concatenar **c()** de R base. -- ```r const <- c("Pegasus", "Cetus", "Hydra", "Equuleus") abrev <- c("Peg", "Cet", "Hya", "Equ") num <- c(177,189,238,16) sec <- c(1:50) ``` -- Consultamos su clase usando la función **class()** -- ```r class(const) ``` ``` ## [1] "character" ``` ```r class(num) ``` ``` ## [1] "numeric" ``` ```r class(sec) ``` ``` ## [1] "integer" ``` --- ### Funciones más comunes ```r mean() # Promedio median() # Mediana sd() # Desviación estandar sum() # Sumatorias exp() # Exponenciales sqrt() # Raiz cuadrada abs() # valores absolutos pi # para el número Pi ``` -- ```r mean(c(50,70,98,68)) ``` ``` ## [1] 71.5 ``` ```r sum(c(50,70,98,68)) ``` ``` ## [1] 286 ``` -- ```r obj <- c(50,70,98,68) mean(obj) ``` ``` ## [1] 71.5 ``` --- ### Funciones más comunes #### Argumentos de una función -- ```r ??seq() ``` -- ```r ## from = inicio ## to = final ## by = intervalo ``` -- ```r seq(from=2,to=50,by=3) ``` ``` ## [1] 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 ``` --- ### Creando una pequeña base de datos estilo tabla ```r set.seed(100) # Esto garantiza que dentro de la aleatoriedad, # todos tengamos el mismo resultado simulado. vpm1 <- rnorm(n=100, mean=80, sd=5) vpm2 <- rnorm(n=100, mean=75, sd=10) vpm3 <- rnorm(n=100, mean=60, sd=25) tabla <- data.frame(vpm1,vpm2,vpm3) ``` --- ### Creando una pequeña base de datos estilo tabla ```r view(tabla) ```
--- ### Creando una pequeña base de datos estilo tabla Ahora si nos fijamos, nuestros valores aleatorios se generan con "n" cantidad de decimales, más de los que necesitamos, por lo que tenemos algunas opciones para limitarlos con la funciones: -- ```r round(x=77.5492, digits=2) # debemos indicar el valor o vector y el número de decimales. Aproxima el último. ``` ``` ## [1] 77.55 ``` ```r signif(77.5492, 4) # debemos indicar el valor o vector y el número de dÃgitos. Aproxima el último. ``` ``` ## [1] 77.55 ``` ```r floor(77.5492) # redondea al entero próximo sin aproximar. ``` ``` ## [1] 77 ``` ```r trunc(77.5492*100)/100 # nos permite cortar decimales sin apróximar, dincando el valor o vector, multiplicarlo por una potencia de 10 (dependiendo de cuantos decimales queremos) y dividirlo por la misma potencia ``` ``` ## [1] 77.54 ``` --- ### Creando una pequeña base de datos estilo tabla Sabiendo ello, tenemos 2 alternativas: a) Alojando una función dentro de otra. ```r set.seed(100) round(rnorm(n=10, mean=80, sd=5), digits=2) ``` ``` ## [1] 77.49 80.66 79.61 84.43 80.58 81.59 77.09 83.57 75.87 78.20 ``` b) Encadenando procesos y la librerÃa **magrittr**. ```r #install.packages("magrittr") # esta función nos permite instalar librerias library(magrittr) set.seed(100) rnorm(n=10, mean=80, sd=5) %>% round(digits=2) ``` ``` ## [1] 77.49 80.66 79.61 84.43 80.58 81.59 77.09 83.57 75.87 78.20 ``` --- ### Creando una pequeña base de datos estilo tabla ```r set.seed(100) vpm1 <- rnorm(n=100, mean=80, sd=5) vpm2 <- rnorm(n=100, mean=75, sd=10) vpm3 <- rnorm(n=100, mean=60, sd=25) tabla <- data.frame(vpm1,vpm2,vpm3) %>% round(digits=2) ``` ```r view(tabla) ```
--- ### Abriendo una base de datos estilo tabla ```r # Para abrir un archivo en formato csv: # el argumento dec determina el tipo de separador de decimales, y # el argumento sep el separador de columnas t.csv <- read.csv("C:/TuDirectorio/MET_CAUQUENES.csv", dec=".") # Para abrir un archivo en formato xls # install.packages("xlsx") library(xlsx) t.excel <- read.xlsx("C:/TuDirectorio/MET_CAUQUENES.xls",1) #Indicamos directorio y, Sheet. ``` -- ```r view(t.excel) ```
--- ### Manipulando una base de datos estilo tabla Las primeras manipulaciones consisten substraer, filtrar, modificar o agregar información nueva a nuestra base datos. -- **Substraer** ```r # Opción 1: por nombre de la columna sub1 <- t.csv$PP # Opción 2: por posición de la columna sub2 <- t.csv[,5] # Opción 3: por posición de la fila sub3 <- t.csv[58,] ``` --- ### Manipulando una base de datos estilo tabla **Filtrar** ```r # Opcion 1: por condición según columna filtro1 <- t.csv[which(t.csv$Month == 3),] # Opción 2: usando función subset() filtro2 <- subset(t.csv, Month == 8) # Opcion 3: usando la función filter() del paquete dplyr #install.package("dplyr") library(dplyr) filtro3 <- filter(t.csv, Year == 2019) ``` --- **Modificar** ```r # Opción 1: modificar una columna completa mod <- t.csv # con esto nos aseguramos de no cometer errores en la original mod$PP <- mod$PP/1000 # para pasar de mm a cm3 # Opción 2: cambiar algunos elementos según condición mod[which(mod$Year < 1990),] <- NA # NA es Not Available o sea sin dato mod <- na.omit(mod) # eliminamos las filas con NA's # se podrÃa haber llegado a este mismo resultado solo filtrando # ... y tantas otras opciones que se nos ocurran ``` **Agregar** ```r mod$Amp <- mod$Tmax-mod$Tmin #creamos una nueva columna amp con la diferencia entre Tmin y Tmax ```
--- ### Ciclos y Funciones sencillas Un **ciclo** es la repetición de "n veces" una misma rutina. El más conocido y ocupado es el ciclo for que se compone por: <center><img src="data:image/png;base64,#Loop.png" height="150px" /></center> Crearemos un **ciclo** sencillo en dónde se repita un digitos tantas veces como valor lo indique. ```r for(i in 2:8){ num <- rep(i,i) print(paste("REPITE ESTE NUMERO ",i,", ",i," VECES", sep="")) print(num) } ``` --- ### Ciclos y Funciones sencillas Entoncesel resultado de nuestro ciclo serÃa: ```r for(i in 2:8){ num <- rep(i,i) print(paste("REPITE ESTE NUMERO ",i,", ",i," VECES", sep="")) print(num) } ``` ``` ## [1] "REPITE ESTE NUMERO 2, 2 VECES" ## [1] 2 2 ## [1] "REPITE ESTE NUMERO 3, 3 VECES" ## [1] 3 3 3 ## [1] "REPITE ESTE NUMERO 4, 4 VECES" ## [1] 4 4 4 4 ## [1] "REPITE ESTE NUMERO 5, 5 VECES" ## [1] 5 5 5 5 5 ## [1] "REPITE ESTE NUMERO 6, 6 VECES" ## [1] 6 6 6 6 6 6 ## [1] "REPITE ESTE NUMERO 7, 7 VECES" ## [1] 7 7 7 7 7 7 7 ## [1] "REPITE ESTE NUMERO 8, 8 VECES" ## [1] 8 8 8 8 8 8 8 8 ``` --- ### Ciclos y Funciones sencillas Ahora, usaremos los condicionales if() y else() para que cada vez que encuentre una temperatura máxima superior a los 25° nos indique esta cara **(T.T)** y cuando sea menor **(n.n)** -- ```r for(i in 1:nrow(mod)){ val <- mod$Tmax[i] if(val >= 25){ print("(T.T)") } else{ print("(n.n)")} } ``` --- ### Ciclos y Funciones sencillas Ahora, veremos una situación un poco más complicada: .pull-left[ - Supongamos tenemos 10 archivos que contienen información de la temperatura media de algunas ciudades de la región del Maule, y queremos juntarlas en una. - Si nos fijamos, tenemos una columna con la fecha, el año, el mes y otra con el valor de la temperatura media, por lo que tenemos 4 columnas. - Debemos considerar para es ciclo o loop, el que todas las tablas tengan la misma estructura, misma cantidad filas o columnas (para no complejizar el ejercicio). ] -- .pull-right[ <img src="data:image/png;base64,#Tablas_loop.png" width="500px" align = "center"/> ] --- ### Ciclos y Funciones sencillas ```r # Primero: crearemos un objeto indicando el directorio donde están nuestros archivos dir <- "C:/TuDirectorio/" # Segundo: crearemos un nuevo objeto con un enlistado de las direcciones para cada archivo ... vect.list <- list.files(path=dir, pattern = glob2rx("*.csv"),full.names = T) # glob2rx nos posibilita filtrar según un enunciado. #Tercero: abriremos la primera tabla en la que pegaremos la informacion de las siguientes df <- read.csv(vect.list[1]) # Tercero: preparamos nuestro ciclo for(i in 2:10){ #a) leemos nuestro archivo tb <- read.csv(vect.list[i]) #b) pegamos la 4 columna de nuestro archivo usando la funcion cbind, # reemplazando la tabla original df <- cbind(df,tb[,4]) print(paste("LISTA TABLA N°",i,"DE 10",sep=" ")) } ``` --- ### Ciclos y Funciones sencillas ```r view(df) ```
--- ### Ciclos y Funciones sencillas Cambiaremos los nombres de los headers de nuestra tabla usando la función **names()** y **substr()**. _names_ nos permite nombrar las columnas de nuestro data frame, por lo tanto debemos ingresar un vector cuya extensión sea la misma que la misma cantidad de columnas. _substr_ nos permite substraer parte de un vector de numerico o alfanumerico, indicando la posición de estos, por ejemplo:  Ahora como no todos los nombres tienen la misma cantidad de caracteres, siempre la posición #63 indicará el inicio, pero la #71 no siempre indicará la última. Por ello usaremos la funcion **nchar()**. _nchar_ nos indica el número de caracteres o posiciones de un vector, al cual le restaremos 4 que es la cantidad de posiciones que tiene la extensión del archivo (.csv). --- ### Ciclos y Funciones sencillas ```r id <- substr(x=vect.list, start=63, stop=nchar(vect.list)-4 ) id ``` ``` ## [1] "Cauquenes" "Chanco" "Constitucion" "Curepto" "Curico" ## [6] "Linares" "LosRiscos" "Robleria" "Talca" "Vichuquen" ``` ```r names(df) <- c("Date","Year","Month",id) ``` ```r view(df) ```
--- ### Ciclos y Funciones sencillas Crearemos una **función** que calcule grados Fahrenheit a partir de grados Celsius -- ```r CaF <- function(C_temp){ (C_temp*9/5)+32 } ``` -- ```r # Calculamos para un valor CaF(C_temp = 25) ``` ``` ## [1] 77 ``` ```r # Calculamos para un vector numérico print(mod$Tmed[1:10]) # se lo aplicamos a una columna de nuestro data frame modificado. ``` ``` ## [1] 19.87 18.86 17.02 13.92 11.48 9.72 9.00 10.89 11.39 12.50 ``` ```r CaF(C_temp = mod$Tmed)[1:10] ``` ``` ## [1] 67.766 65.948 62.636 57.056 52.664 49.496 48.200 51.602 52.502 54.500 ``` --- ### Guardar nuestra base de datos ```r # Si queremos guardar nuestra tabla como un csv escribimos... write.csv(mod,"C:/TuDirectorio/TuNombreDeArchivo.csv") # Si la queremos guardar como excel usamos la libreria xlsx write.xlsx(mod, "C:/TuDirectorio/TuNombreDeArchivo.xlsx", sheetName = "Hoja_1") ``` --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** simple ```r a2019 <- filter(mod, Year == 2019) barplot(a2019$PP) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-42-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color ```r barplot(a2019$PP, col= "blue") ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-43-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color y lÃmite del eje Y definido ```r barplot(a2019$PP, col = "blue", ylim = c(0,0.35)) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-44-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color, lÃmite del eje Y definido y nombres de las barras ```r barplot(a2019$PP, col = "blue", ylim = c(0,0.35), names=a2019$Month) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-45-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color, lÃmite del eje Y definido, nombres de las barras y nombres de ejes ```r barplot(a2019$PP, col = "blue", ylim = c(0,0.35), names=a2019$Month, ylab = "Precipitacion m3", xlab = "Meses" ) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-46-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Puntos** simples ```r mod$Date <- as.Date(mod$Date, format="%Y-%m-%d") # con esto la columna Date tendrá clase Date plot(x= mod$Date, y= mod$Tmed) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-47-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Puntos** con distintas formas y colores ```r plot(x= mod$Date, y= mod$Tmed, pch=8, col="red", ylab="Temperatura Media (C°)", xlab="Años") ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-48-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) <center><img src="data:image/png;base64,#Symbol.png" height="500px" /></center> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Lineas** ```r #A diferencia con el plot anterior ya no usamos el argumento pch, y usamos type para indicar line plot(x=mod$Date, y=mod$Tmed, type="l", col="red", ylab="Temperatura Media (C°)", xlab="Años") ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-49-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Lineas y puntos** ```r plot(x=mod$Date, y=mod$Tmed, pch=20, col ="brown", ylab ="Temperatura Media (C°)", xlab ="Años") # Para agregar las lineas sobre los puntos, usamos la funcion lines() lines(x=mod$Date, y= mod$Tmed, col ="red") ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-50-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Boxplot** ```r boxplot(mod$Tmed~mod$Month, col= rainbow(12),names= unique(mod$Month), xlab= "Meses", ylab="Temperatura Media (C°)") ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-51-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** ```r hist(mod$Tmed, breaks= 20, col= "red", xlab= "Temperatura Media (C°)", ylab= "Frecuencia", main= "Histograma de Precipitaciones; breaks=20") ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-52-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** Para profundizar un poco más en algunas potencialidades de los histogramas, crearemos datos: ```r set.seed(40) indice_veg <- rnorm(n=100, mean=0.4, sd=0.05) %>% round(2) hist(indice_veg,breaks=50,main="", xlab="Indice de Vegetacion") ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-54-1.png" width="100%" /> De esta forma podemos clasificar los intervalos de los datos --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** Clasificación por intervalos iguales ```r equal <- function(x,class){ min <- min(x,na.rm=T) max <- max(x,na.rm=T) brk <- (max-min)/class breaks <- round(seq(min,max,brk),2) return(breaks) } igual <- equal(indice_veg, class=5) igual ``` ``` ## [1] 0.30 0.34 0.38 0.43 0.47 0.51 ``` --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** Clasificación por Intervalos iguales ```r hist(indice_veg, breaks=50, col="red",main="", xlab="Indice de Vegetacion") abline(v=igual, col="blue",lwd=2) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-56-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** Clasificación por Cuartiles ```r q4 <- quantile(x=indice_veg, prob=seq(0,1,length=5),na.rm=T) hist(indice_veg, breaks=50, col="red",main="", xlab="Indice de Vegetacion") abline(v=q4, col="blue",lwd=2) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-57-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** Clasificación por Deciles ```r d10 <- quantile(x=indice_veg, prob=seq(0,1,length=11),na.rm=T) hist(indice_veg, breaks=50, col="red",main="", xlab="Indice de Vegetacion") abline(v=d10, col="blue",lwd=2) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-58-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** Clasificación por Quiebres naturales ```r #install.packages("BAMMtools") library(BAMMtools) jenk <- getJenksBreaks(indice_veg,6) hist(indice_veg, breaks=50, col="red",main="", xlab="Indice de Vegetacion") abline(v=jenk, col="blue",lwd=2) ``` <img src="data:image/png;base64,#Intro_R_files/figure-html/unnamed-chunk-59-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** ¿Cuál es la utilidad de esto? -- - Nos permite saber como se agrupan nuestros datos de manera cuantitativa. -- - Nos permite determinar cual es el mejor método o rango para representar dicha agrupación. -- - Si nuestros datos están asociados a una unidad espacial, como manzanas censales, comunas, regiones, etc. nos permite identificar patros espaciales de agrupación según su continuidad espacial. <img src="data:image/png;base64,#join.png" width="800px" align = "center"/> --- .pull-left[ <img src="data:image/png;base64,#IDH.png" width="500px" align = "center"/> ] -- .pull-right[ <img src="data:image/png;base64,#DSS.png" width="500px" align = "center"/> ] .footnote[ <span style="font-size:9pt"> Fuente: Fuenzalida, M. et al (2015) _"GeografÃa, GeotecnologÃa y Análisis espacial"_ </span> ] --- ### BibliografÃa 2018 Mas, Jean-Francois. _Análisis espacial con R. Usa R como un Sistema de Información Geográfica_. European Scientific Institute, Republic of Macedonia. 2015 McNeill Mhairi. _Base R (RStudio Cheatsheet)_. Disponible en Aula virtual. 2020 R. _The R Project for Statistical Computing_. <a href="https://www.r-project.org/"> (Online) </a><br> 2011 Teetor Paul. _R Cookbook: Proven Recipes for Data Analysis, Statistics, and Graphics_. Versión en Linea por Chang Winston. <a href="http://www.cookbook-r.com/"> (Online) </a><br> --- class: inverse middle 